"""
计算器工具实现
支持基本的数学运算
"""

import logging
import math
from typing import Union

from ..function_call.function_registry import FunctionRegistry

logger = logging.getLogger(__name__)


class Calculator:
    """计算器类"""
    
    @staticmethod
    def calculate(op: str, a: float, b: float) -> float:
        """执行基本数学运算"""
        try:
            if op == 'add':
                return a + b
            elif op == 'sub':
                return a - b
            elif op == 'mul':
                return a * b
            elif op == 'div':
                if b == 0:
                    raise ValueError('除数不能为0')
                return a / b
            elif op == 'pow':
                return a ** b
            elif op == 'mod':
                if b == 0:
                    raise ValueError('模数不能为0')
                return a % b
            else:
                raise ValueError(f'不支持的操作: {op}')
        except Exception as e:
            logger.error(f"计算错误: {op}({a}, {b}) - {e}")
            raise
    
    @staticmethod
    def advanced_calculate(operation: str, *args) -> float:
        """执行高级数学运算"""
        try:
            if operation == 'sqrt':
                if len(args) != 1:
                    raise ValueError('sqrt需要1个参数')
                if args[0] < 0:
                    raise ValueError('不能计算负数的平方根')
                return math.sqrt(args[0])
            
            elif operation == 'sin':
                if len(args) != 1:
                    raise ValueError('sin需要1个参数')
                return math.sin(math.radians(args[0]))
            
            elif operation == 'cos':
                if len(args) != 1:
                    raise ValueError('cos需要1个参数')
                return math.cos(math.radians(args[0]))
            
            elif operation == 'tan':
                if len(args) != 1:
                    raise ValueError('tan需要1个参数')
                return math.tan(math.radians(args[0]))
            
            elif operation == 'log':
                if len(args) == 1:
                    if args[0] <= 0:
                        raise ValueError('对数的真数必须大于0')
                    return math.log10(args[0])
                elif len(args) == 2:
                    if args[0] <= 0 or args[1] <= 0:
                        raise ValueError('对数的真数和底数必须大于0')
                    if args[1] == 1:
                        raise ValueError('对数的底数不能为1')
                    return math.log(args[0], args[1])
                else:
                    raise ValueError('log需要1或2个参数')
            
            elif operation == 'ln':
                if len(args) != 1:
                    raise ValueError('ln需要1个参数')
                if args[0] <= 0:
                    raise ValueError('自然对数的真数必须大于0')
                return math.log(args[0])
            
            elif operation == 'abs':
                if len(args) != 1:
                    raise ValueError('abs需要1个参数')
                return abs(args[0])
            
            elif operation == 'round':
                if len(args) == 1:
                    return round(args[0])
                elif len(args) == 2:
                    return round(args[0], int(args[1]))
                else:
                    raise ValueError('round需要1或2个参数')
            
            else:
                raise ValueError(f'不支持的高级操作: {operation}')
                
        except Exception as e:
            logger.error(f"高级计算错误: {operation}({args}) - {e}")
            raise


# 注册基本计算器函数
@FunctionRegistry.register_function('calculator', '基本数学计算器，支持加减乘除等运算')
def calculator_func(op: str, a: float, b: float) -> str:
    """计算器函数"""
    try:
        result = Calculator.calculate(op, a, b)
        # 格式化结果，如果是整数则不显示小数点
        if result == int(result):
            formatted_result = str(int(result))
        else:
            formatted_result = f"{result:.6f}".rstrip('0').rstrip('.')
        
        # 生成友好的回复
        op_names = {
            'add': '加法',
            'sub': '减法', 
            'mul': '乘法',
            'div': '除法',
            'pow': '幂运算',
            'mod': '取模'
        }
        
        op_name = op_names.get(op, op)
        return f"{op_name}计算结果：{formatted_result}"
        
    except ValueError as e:
        return f"计算错误：{str(e)}"
    except Exception as e:
        return f"计算过程出错：{str(e)}"


# 注册高级计算器函数
@FunctionRegistry.register_function('advanced_calculator', '高级数学计算器，支持三角函数、对数、开方等')
def advanced_calculator_func(operation: str, args: list) -> str:
    """高级计算器函数"""
    try:
        result = Calculator.advanced_calculate(operation, *args)
        
        # 格式化结果
        if result == int(result):
            formatted_result = str(int(result))
        else:
            formatted_result = f"{result:.6f}".rstrip('0').rstrip('.')
        
        # 生成友好的回复
        op_names = {
            'sqrt': '平方根',
            'sin': '正弦',
            'cos': '余弦', 
            'tan': '正切',
            'log': '对数',
            'ln': '自然对数',
            'abs': '绝对值',
            'round': '四舍五入'
        }
        
        op_name = op_names.get(operation, operation)
        return f"{op_name}计算结果：{formatted_result}"
        
    except ValueError as e:
        return f"计算错误：{str(e)}"
    except Exception as e:
        return f"计算过程出错：{str(e)}"
